package com.bbva.kyfb.kyfbbofi;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.GZIPInputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.drools.core.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.stereotype.Service;

import com.bbva.jee.arq.spring.core.contexto.ArqSpringContext;
import com.bbva.jee.arq.spring.core.contexto.Contexto;
import com.bbva.jee.arq.spring.core.gce.ExcepcionEjecucionAplicacion;
import com.bbva.jee.arq.spring.core.log.I18nLog;
import com.bbva.jee.arq.spring.core.log.I18nLogFactory;
import com.bbva.jee.arq.spring.core.util.excepciones.PropiedadNoEncontradaExcepcion;
import com.bbva.jee.arq.spring.core.util.excepciones.PropiedadNoParseableExcepcion;
import com.bbva.kyfb.kyfbdto.firmas.bo.ComponentePutFirma;
import com.bbva.kyfb.kyfbdto.firmas.bo.DatosPAU;
import com.bbva.kyfb.kyfbdto.firmas.bo.FicheroPdteFirma;
import com.bbva.kyfb.kyfbdto.firmas.bo.FirmaComponente;
import com.bbva.kyfb.kyfbdto.firmas.bo.InfoAssistantDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.InfoComponentDetailDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.InfoComponentInDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.ObjetoFirmable;
import com.bbva.kyfb.kyfbdto.firmas.errores.Errores_kyfb_servicios;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.SignedComponentsResponse;
import com.bbva.kyfb.kyfbutils.constantes.ConstantesFO;
import com.bbva.kyfb.kyfbutils.constantes.UtilFO;

/**
 * The Class ServicioFirmasBoAsistenteUtil.
 */
@Service("servicioFirmasBoAsistenteUtil")
public class ServicioFirmasBoAsistenteUtil {

	/** Variable LOG. */
	private static final I18nLog LOG = I18nLogFactory
			.getLogI18n(ServicioFirmasBoAsistenteUtil.class);

	private static final String RUTA_TESTS_XMLS = "src\\test\\resources\\META-INF\\XMLTests\\";

	/** The servicio firmas bo util. */
	@Autowired
	private ServicioFirmasBoUtil servicioFirmasBoUtil;

	/** The servicio firmas bo host util. */
	@Autowired
	private ServicioFirmasBoHostUtil servicioFirmasBoHostUtil;

	/** The servicio firmas bo host util. */
	@Autowired
	private ServicioFirmasBoClientsUtil servicioFirmasBoClientsUtil;

	/**
	 * @param urlFinal
	 * @param datosPau
	 * @return
	 */
	public String lanzarAsistente(final String urlFinal, final DatosPAU datosPau) {
		String rdoAsistente = "";
		final List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(10);

		// nameValuePairs.add(new BasicNameValuePair("s_tipo_firma", "FH"));
		// nameValuePairs.add(new BasicNameValuePair("numItem",
		// "470811244858"));
		nameValuePairs
		.add(new BasicNameValuePair("pb_cod_serv",
				obtenerClaveCabeceraHTTP("pb_cod_serv",
						ConstantesFO.PB_COD_SERV))); // "8550"
		nameValuePairs.add(new BasicNameValuePair("pb_cod_proc",
				obtenerClaveCabeceraHTTP("iv-cod_emp", ConstantesFO.VACIO))); // "20072592"
		nameValuePairs.add(new BasicNameValuePair("LOCALE", ArqSpringContext
				.getLocaleAplicacion().toString()));
		nameValuePairs.add(new BasicNameValuePair("pb_cod_ffecha",
				obtenerClaveCabeceraHTTP("pb_cod_ffecha", ConstantesFO.VACIO))); // "dd/MM/yyyy"
		nameValuePairs.add(new BasicNameValuePair("pb_cod_fimporte",
				obtenerClaveCabeceraHTTP("pb_cod_fimporte", ConstantesFO.VACIO))); // "0.000,00"
		nameValuePairs.add(new BasicNameValuePair("pb_husohora",
				obtenerClaveCabeceraHTTP("pb_husohora", ConstantesFO.VACIO))); // "(GMT+01:00)"
		nameValuePairs.add(new BasicNameValuePair("pb_xti_comprper",
				obtenerClaveCabeceraHTTP("pb_xti_comprper",
						ConstantesFO.PB_XTI_COMPRPER))); // "N"
		nameValuePairs
		.add(new BasicNameValuePair("pb_segmento",
				obtenerClaveCabeceraHTTP("pb_segmento",
						ConstantesFO.PB_SEGMENTO))); // "00000"
		nameValuePairs.add(new BasicNameValuePair("xtiTipoProd",
				ConstantesFO.XTITIPOPROD));
		nameValuePairs.add(new BasicNameValuePair("pb_cod_prod",
				obtenerCabeceraProdPibee("iv-prod_pibee", ConstantesFO.NOT_FOUND,
						datosPau))); // "201"

		LOG.info("TODOS LOS PARAMETROS INICIALIZADOS");
		final String paramString = URLEncodedUtils.format(nameValuePairs, "UTF-8");
		LOG.info("CREAMOS LOS PARAMETROS: " + paramString);
		final String urlFinalPrms = urlFinal.trim() + ConstantesFO.AMPERSAN
				+ paramString.trim();
		LOG.info("URIFINAL: " + urlFinalPrms);

		final HttpClient httpclient = new DefaultHttpClient();
		LOG.info("PASO1");
		final HttpGet httpget = new HttpGet(urlFinalPrms);
		generarCabecera(httpget);
		LOG.info("LA LLAMADA FINAL AL ASISTENTE ES: " + httpget.toString());

		try {
			LOG.info("******* LLAMADA ASISTENTE ******** Entrada llamada asistente");
			final long tiempoInicial = System.currentTimeMillis();
			final HttpResponse response = httpclient.execute(httpget);
			final long tiempoFinal = System.currentTimeMillis();
			final long tiempoTotal = tiempoFinal - tiempoInicial;
			LOG.info("******* LLAMADA ASISTENTE ******** Salida llamada asistente");
			LOG.info("******* LLAMADA ASISTENTE ******** Tiempo:" + tiempoTotal);
			LOG.info("LA EJECUCION DEL ASISTENTE SE LLEVO A CABO");

			final Header contentEncoding = response.getEntity().getContentEncoding();

			if (contentEncoding != null && contentEncoding.getValue().contains("gzip")) {
				rdoAsistente = leerXML(new GZIPInputStream(response.getEntity()
						.getContent()));
			} else {

				rdoAsistente = leerXML(new InputStreamReader(response
						.getEntity().getContent()));
			}

		} catch (final IOException e) {
			LOG.error("ServicioFirmasBoAsistente.lanzarAsistente - Ha ocurrido un error de E/S");
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfb_servicios.ERROR_AL_LANZAR_ASISTENTE, e);
		} catch (final Exception e) {
			LOG.error("ServicioFirmasBoAsistente.lanzarAsistente - Ha ocurrido un error generico");
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfb_servicios.ERROR_AL_LANZAR_ASISTENTE, e);
		}
		return rdoAsistente;
	}

	/**
	 * @param httpget
	 */
	private void generarCabecera(final HttpGet httpget) {
		try{
			httpget.addHeader(ConstantesFO.HOST, ArqSpringContext.getPropiedad(ConstantesFO.VARHOSTPAU));
		}catch(final PropiedadNoEncontradaExcepcion e){
			LOG.debug(e,"La llamada a los asistentes falla debido a que no se encuentra la propiedad del host. ArqSpringContext.getPropiedad",ConstantesFO.VARHOSTPAU);
		}
		httpget.addHeader(ConstantesFO.CONNECTION, ConstantesFO.KEEP_ALIVE);
		httpget.addHeader(ConstantesFO.CACHE_CONTROL, ConstantesFO.MAX_AGE_0);
		httpget.addHeader(ConstantesFO.ACCEPT_ENCODING,
				ConstantesFO.GZIP_DEFLATE_SDCH);
		httpget.addHeader(ConstantesFO.ACCEPT,
				obtenerClaveCabeceraHTTP(ConstantesFO.ACCEPT, ConstantesFO.VACIO));
		httpget.addHeader(
				ConstantesFO.USER_AGENT,
				obtenerClaveCabeceraHTTP(ConstantesFO.USER_AGENT,
						ConstantesFO.VACIO));
		httpget.addHeader(
				ConstantesFO.ACCEPT_LANGUAGE,
				obtenerClaveCabeceraHTTP(ConstantesFO.ACCEPT_LANGUAGE,
						ConstantesFO.VACIO));
		httpget.addHeader(
				ConstantesFO.IVUSER,
				obtenerClaveCabeceraHTTP(ConstantesFO.IVUSER,
						ConstantesFO.VACIO));
		httpget.addHeader(
				ConstantesFO.IVCODBAN,
				obtenerClaveCabeceraHTTP(ConstantesFO.IVCODBAN,
						ConstantesFO.VACIO));
		httpget.addHeader(
				ConstantesFO.IVGROUPS,
				obtenerClaveCabeceraHTTP(ConstantesFO.IVGROUPS,
						ConstantesFO.VACIO));
		httpget.addHeader(
				ConstantesFO.IVIDUNICO,
				obtenerClaveCabeceraHTTP(ConstantesFO.IVIDUNICO,
						ConstantesFO.VACIO));
		httpget.addHeader(
				ConstantesFO.IVTIPOUSU,
				obtenerClaveCabeceraHTTP(ConstantesFO.IVTIPOUSU,
						ConstantesFO.VACIO));
		httpget.addHeader(
				ConstantesFO.IVCODUSU,
				obtenerClaveCabeceraHTTP(ConstantesFO.IVCODUSU,
						ConstantesFO.VACIO));
		httpget.addHeader(
				ConstantesFO.IVCODCANAL,
				obtenerClaveCabeceraHTTP(ConstantesFO.IVCODCANAL,
						ConstantesFO.VACIO));
		httpget.addHeader(
				ConstantesFO.IVCODEMP,
				obtenerClaveCabeceraHTTP(ConstantesFO.IVCODEMP,
						ConstantesFO.VACIO));
	}

	/**
	 * @param getParams
	 * @param urlBase
	 * @param datosPau
	 * @return
	 */
	private String prepararYlanzarAsistente(
			final Map<String, String> getParams, final String urlBase,
			final DatosPAU datosPau) {

		String resultado = "";
		
		 StringBuilder url = new StringBuilder("");

		try {
			if(!urlBase.startsWith("http")) {
				final String urlPau = ArqSpringContext.getPropiedad(ConstantesFO.URLPAU);

				url = new StringBuilder(urlPau);
				url.append(urlBase);

				for (final Map.Entry<String, String> e : getParams.entrySet()) {
					url.append("&").append(e.getKey()).append("=")
					.append(e.getValue());
				}

			}
			else {
				url = new StringBuilder(urlBase);
			}
			
			

			resultado = lanzarAsistente(url.toString(), datosPau);

		} catch (final PropiedadNoEncontradaExcepcion e) {
			LOG.error(
					e,
					"ServicioFirmasBoAsistente.lanzarAsistente error al recuperar URL",
					getParams, urlBase, datosPau);
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfb_servicios.ERROR_AL_LANZAR_ASISTENTE, e);
		}
		return resultado;
	}

	/**
	 * Lanzar asistente detalle.
	 * 
	 * @param descriptorXml
	 *            the descriptor xml
	 * @return the string
	 * @throws ExcepcionEjecucionAplicacion
	 *             the excepcion ejecucion aplicacion
	 */
	public InfoComponentDetailDto lanzarAsistenteDetalle(final String url,
			final InfoComponentInDto info) {

		final Map<String, String> paramsUrl = new HashMap<String, String>();
		InfoComponentDetailDto infoCompDetDto;

		paramsUrl.put("idOrigenSpring", info.getsIdOrdenFirmas());
		// paramsUrl.put("claseOrdenSpring",info.getsCodTipoOrden());
		paramsUrl.put("idiomaSpring", info.getsIdioma());
		paramsUrl.put("mostrarOrdenes", info.getsMostrarOrdenes());

		final String respuesta = prepararYlanzarAsistente(paramsUrl, url, null);

		infoCompDetDto = (InfoComponentDetailDto) respuestaAsistenteToDto(
				"com.bbva.kyfb.kyfbdto.firmas.bo.InfoComponentDetailDto",
				respuesta);

		final String codErrorCBTF = infoCompDetDto.getCodError();
		final String codErrorApp = ConstantesFO.ERRORES_DETALLE_MAP.get(
				codErrorCBTF == null ? null : codErrorCBTF.trim()).toString();
		infoCompDetDto.setCodError(codErrorApp);

		if (!Errores_kyfb_servicios.OK.toString().equals(codErrorApp)) {
			new ExcepcionEjecucionAplicacion(
					ConstantesFO.ERRORES_DETALLE_MAP.get(codErrorCBTF));
		}

		return infoCompDetDto;
	}

	/**
	 * Lanzar asistente mock.
	 * 
	 * @param descriptorXml
	 *            the descriptor xml
	 * @return the string
	 * @throws ExcepcionEjecucionAplicacion
	 *             the excepcion ejecucion aplicacion
	 */
	public String lanzarAsistenteMock(final String descriptorXml)
			throws ExcepcionEjecucionAplicacion {
		String mockCBTF;

		final StringBuilder pathFile = new StringBuilder(RUTA_TESTS_XMLS);

		if (descriptorXml != null) {
			pathFile.append(descriptorXml);
		} else {
			pathFile.append("detalleDefault");
		}

		pathFile.append(".xml");

		final File ficheroXML = new File(pathFile.toString());

		try {
			if (ficheroXML.exists()) {
				mockCBTF = leerXML(new FileReader(ficheroXML));
			} else {
				mockCBTF = "";
			}
		} catch (final FileNotFoundException e) {
			LOG.error("ServicioFirmasBoImpl.lanzarAsistenteDetalleMock - No se encuentra el fichero xml de prueba");
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfb_servicios.EL_FICHERO_NO_EXISTE, e);
		}

		return mockCBTF;
	}

	/**
	 * Lanzar asistente detalle mock.
	 * 
	 * @param descriptorXml
	 *            the descriptor xml
	 * @return the string
	 * @throws ExcepcionEjecucionAplicacion
	 *             the excepcion ejecucion aplicacion
	 */
	public InfoComponentDetailDto lanzarAsistenteDetalleMock(
			final String descriptorXml) throws ExcepcionEjecucionAplicacion {

		final String mockCBTF = lanzarAsistenteMock(descriptorXml);

		// En el mock no se llama al asistente si no que se simula su respuesta

		final InfoComponentDetailDto infoCompDetDtoMock = (InfoComponentDetailDto) respuestaAsistenteToDto(
				"com.bbva.kyfb.kyfbdto.firmas.bo.InfoComponentDetailDto",
				mockCBTF);

		final String codErrorCBTF = infoCompDetDtoMock.getCodError();
		final String codErrorApp = ConstantesFO.ERRORES_DETALLE_MAP.get(
				codErrorCBTF == null ? null : codErrorCBTF.trim()).toString();
		infoCompDetDtoMock.setCodError(codErrorApp);

		if (!Errores_kyfb_servicios.OK.toString().equals(codErrorApp)) {
			new ExcepcionEjecucionAplicacion(
					ConstantesFO.ERRORES_DETALLE_MAP.get(codErrorCBTF));
		}

		return infoCompDetDtoMock;
	}

	/**
	 * Leer xml.
	 * 
	 * @param xmlStream
	 *            the xml stream
	 * @return the string
	 * @throws ExcepcionEjecucionAplicacion
	 *             the excepcion ejecucion aplicacion
	 */
	private String leerXML(final InputStreamReader xmlStream)
			throws ExcepcionEjecucionAplicacion {
		final StringBuilder xmlContent = new StringBuilder();

		try {
			LOG.info("SE LEE LA RESPUESTA DESDE CBTF/TEST XML");
			final BufferedReader rd = new BufferedReader(xmlStream);

			String linea;

			while ((linea = rd.readLine()) != null) {
				xmlContent.append(linea);
			}
		} catch (final IOException e) {
			LOG.error("ServicioFirmasBoImpl.leerXML - Error de lectura del xml de prueba");
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfb_servicios.ERROR_GENERICO_EN_LA_REALIZACION_DEL_DETALLE,
					e);
		}
		return xmlContent.toString();
	}

	/**
	 * Leer xml.
	 * 
	 * @param xmlStream
	 *            the xml stream
	 * @return the string
	 * @throws ExcepcionEjecucionAplicacion
	 *             the excepcion ejecucion aplicacion
	 */
	private String leerXML(final GZIPInputStream xmlStream)
			throws ExcepcionEjecucionAplicacion {
		final StringBuilder xmlContent = new StringBuilder();
		try {
			final Reader decoder = new InputStreamReader(xmlStream);

			LOG.info("SE LEE LA RESPUESTA DESDE CBTF/TEST XML");
			final BufferedReader rd = new BufferedReader(decoder);

			String linea;

			while ((linea = rd.readLine()) != null) {
				xmlContent.append(linea);
			}
		} catch (final IOException e) {
			LOG.error("ServicioFirmasBoImpl.leerXML - Error de lectura del xml de prueba");
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfb_servicios.ERROR_GENERICO_EN_LA_REALIZACION_DEL_DETALLE,
					e);
		}
		return xmlContent.toString();
	}

	/**
	 * Devuelve el producto Pibee obtenido de la la llamada al webservice
	 * 
	 * @param clave
	 * @param defecto
	 * @param canal
	 * @param bancoInterno
	 * @param empresa
	 * @return
	 */
	private String obtenerCabeceraProdPibee(final String clave, final String defecto,
			final DatosPAU datosPau) {

		String codProdPibee = obtenerClaveCabeceraHTTP(clave, defecto);
		if (StringUtils.isEmpty(codProdPibee)
				|| defecto.equalsIgnoreCase(codProdPibee)) {
			codProdPibee = servicioFirmasBoClientsUtil.obetenerProductoPibee(
					datosPau, defecto);
		}

		return codProdPibee;

	}

	/**
	 * Devuelve el valor de una clave que se encuentra en la cabecera HTTP.
	 * 
	 * @param clave
	 *            the clave
	 * @return the string
	 */
	public String obtenerClaveCabeceraHTTP(final String clave, final String defecto) {
		Contexto contexto = ArqSpringContext.getContextoEscritorio();

		String resultado;

		if (contexto == null) {
			contexto = new Contexto();
			ArqSpringContext.setContextoEscritorio(contexto);
		}

		try {
			resultado = ArqSpringContext.getContextoEscritorio()
					.getDatosTecnicos().getCabecerasHttp().get(clave).get(0);
			if (StringUtils.isEmpty(resultado)) {
				resultado = defecto;
				LOG.info("La variable es vacio o nula, se setea valor por defecto - "
						+ clave + ": " + resultado);
			}
		} catch (final Exception e) {
			resultado = defecto;
			LOG.info("No se encuentra la variable se setea valor por defecto - " + clave + ": " + resultado,e);
		}

		LOG.info("OBTENEMOS LA CLAVE DE CABECERA HTTP - " + clave + ": "
				+ resultado);
		return resultado;
	}

	/**
	 * Lanzar asistente online.
	 * 
	 * @param firmaComponente
	 *            the firma componente
	 * @param codClienteCash
	 *            the cod cliente cash
	 * @param objetoFirmable
	 *            the objeto firmable
	 * @param cf
	 *            the cf
	 * @param fichero
	 *            the fichero
	 * @param errors
	 *            the errors
	 * @return the signed components response
	 */
	public SignedComponentsResponse lanzarAsistenteOnline(
			final FirmaComponente firmaComponente, final String codClienteCash,
			final ObjetoFirmable objetoFirmable, final ComponentePutFirma cf,
			final FicheroPdteFirma fichero,
			final SignedComponentsResponse errors) {
		SignedComponentsResponse errores = errors;
		// lanzar asistentes con la url del campo
		// DES_URLEJE
		InfoAssistantDto respuestaAsistente = new InfoAssistantDto();
		try {
			respuestaAsistente = lanzarAsistentePut(
					objetoFirmable.getsDesUrlEje(), fichero, firmaComponente,
					cf, ConstantesFO.SIGLAS_FIRMA_HOST);
			if (respuestaAsistente.getCodError().equalsIgnoreCase(
					UtilFO.ASISTENTE_OK)) {
				// Actualizamos el estado del fichero a
				// firmado y enviado HO
				fichero.setsCodEstadoFichero(UtilFO.EST_FIRMADO_ENVIADO);
				servicioFirmasBoUtil.actualizarPutFirmaComponente(
						codClienteCash, fichero, firmaComponente, cf,
						UtilFO.XSN_FIRMADO);
				errores = servicioFirmasBoUtil.actualizarError(errores,
						Errores_kyfb_servicios.ORDEN_FIRMADA_Y_EJECUTADA
						.toString(), cf.getsIdOrdenFirmas(), cf
						.getsTipoOrden(), null, null, null);
				servicioFirmasBoUtil.insertarFirmanteAuditoria(codClienteCash,
						fichero, firmaComponente, cf, (short) 4);
			} else {
				errores = servicioFirmasBoUtil.actualizarError(errores,
						Errores_kyfb_servicios.ERROR_AL_LANZAR_ASISTENTE
						.toString(), cf.getsIdOrdenFirmas(), cf
						.getsTipoOrden(), respuestaAsistente
						.getCodErrorTx(), respuestaAsistente
						.getDescError(), respuestaAsistente
						.getObservaciones());
				// Se hace marcha atras
				servicioFirmasBoHostUtil.marchaAtrasHost(codClienteCash,
						fichero, firmaComponente);
			}
		} catch (final Exception e) {
			LOG.error("ServicioFirmasBoImpl.putFirmaComponenteHost - El asistente del pendiente de ejecutar ha ido mal ",e);
			errores = servicioFirmasBoUtil
					.actualizarError(errores,
							Errores_kyfb_servicios.ERROR_AL_LANZAR_ASISTENTE
							.toString(), cf.getsIdOrdenFirmas(), cf
							.getsTipoOrden(), respuestaAsistente
							.getCodErrorTx(), respuestaAsistente
							.getDescError(), respuestaAsistente
							.getObservaciones());
			// Se hace marcha atras
			servicioFirmasBoHostUtil.marchaAtrasHost(codClienteCash, fichero,
					firmaComponente);
		}
		return errores;
	}


	public String lanzarAsistente(final String url,
			final FicheroPdteFirma fichero,
			final FirmaComponente firmaComponente, final ComponentePutFirma cf,
			final String tipo_firma) {
		return UtilFO.ASISTENTE_OK;
	}

	/**
	 * Lanzar asistente put.
	 * 
	 * @param url
	 *            the url
	 * @param fichero
	 *            the fichero
	 * @param firmaComponente
	 *            the firma componente
	 * @param cf
	 *            the cf
	 * @param tipo_firma
	 *            the tipo_firma
	 * @return the string
	 */
	public InfoAssistantDto lanzarAsistentePut(final String url,
			final FicheroPdteFirma fichero,
			final FirmaComponente firmaComponente, final ComponentePutFirma cf,
			final String tipo_firma) {
		boolean mockTest = true;
		final Map<String, String> paramsUrl = new HashMap<String, String>();
		final StringBuilder respuesta = new StringBuilder();

		try {
			mockTest = ArqSpringContext
					.getPropiedadBoolean(ConstantesFO.CBTFTEST);
		} catch (final PropiedadNoEncontradaExcepcion e) {
			LOG.error(e,"ArqSpringContext.getPropiedadBoolean - La propiedad "
					+ ConstantesFO.CBTFTEST + " no existe",ConstantesFO.CBTFTEST);
		} catch (final PropiedadNoParseableExcepcion e) {
			LOG.error(e,"ServicioFirmasBoImpl.getDetalleComponente - La propiedad "
					+ ConstantesFO.CBTFTEST + " no es parseable",ConstantesFO.CBTFTEST);
		}

		if (mockTest) {
			respuesta.append(lanzarAsistenteMock(fichero.getsIdOrdenFirmas()
					.concat(fichero.getsCodTipoOrden()))); // Nombre de los
			// xml's de
			// prueba: hl51r123TRP.xml
			if (respuesta.length() == 0) {
				respuesta.append("<infoAssistantDto>");
				respuesta.append("<codError>".concat(UtilFO.ASISTENTE_OK).concat("</codError>"));
				respuesta.append("<codErrorTx></codErrorTx>");
				respuesta.append("<descError></descError>");
				respuesta.append("<observaciones></observaciones>");
				respuesta.append("</infoAssistantDto>");
			}
		} else {

			paramsUrl.put("tipoFirma", tipo_firma);
			paramsUrl.put("idOrden",cf.getsIdOrdenFirmas());
			paramsUrl.put("numItem", fichero.getNumItem());

			final String urlAux = url == null ? "" : url.trim();
			respuesta.append(prepararYlanzarAsistente(paramsUrl, urlAux,
					firmaComponente.getDatosPAU()));

		}

		return (InfoAssistantDto) respuestaAsistenteToDto(
				"com.bbva.kyfb.kyfbdto.firmas.bo.InfoAssistantDto",
				respuesta.toString());
	}

	public Object respuestaAsistenteToDto(final String pkgClaseComp, final String respAsist) {

		Object oRdo;

		LOG.info("ServicioFirmasBoAsistenteUtil: sesssssionnnnnnnn" + respAsist);

		final InputStream iResp = new ByteArrayInputStream(respAsist.getBytes());

		final ExpressionParser parser = new SpelExpressionParser();
		final Expression exp = parser.parseExpression("new " + pkgClaseComp + "()");

		try {
			LOG.info("SE VA A PARSEAR LA RESPUESTA POR JAXB: " + respAsist);

			final JAXBContext jc = JAXBContext.newInstance(exp
					.getValue(Object.class).getClass()); // rutaModAsist+modeloDto
			final Unmarshaller u = jc.createUnmarshaller();

			oRdo = u.unmarshal(iResp);

			LOG.info("EL PARSEO POR JAXB FUE CORRECTO");

		} catch (final JAXBException e) {
			LOG.error("ServicioFirmasBoImpl.respuestaAsistenteToDto - Ha ocurrido un error al transformar la respuesta");
			throw new ExcepcionEjecucionAplicacion(
					Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE,e);
		}

		return oRdo;
	}
}
